home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1993 October: Windmill on DISC / ADC Developer CD (1993-10) (''Windmill On DISC'')_iso / Dev.CD Oct 93.iso / System Software / U.S. System Software / System 7 Pro™ Beta 11 / Development Tools / Sample Code / Standard Mail / CollaboDraw (w⁄DigiSign) / draw.mailer.window.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-11  |  12.5 KB  |  567 lines  |  [TEXT/MPS ]

  1. /*-------------------------------------------------------------------------------------
  2.  *
  3.  * Simple Sample AOCE Application Framework
  4.  *
  5.  * ©1991-1993 Apple Computer
  6.  *
  7.  -------------------------------------------------------------------------------------*/
  8. /*
  9.  * draw.mailer.window.c -- mailer window class
  10.  *
  11.  * change history:
  12.  *
  13.  * SJF        04/21/93        1.0b2        update to b2
  14.  * SJF        03/01/93        1.0b1        added digital signatures
  15.  * SJF        02/09/93        1.0b1        update to b1
  16.  * SJF        10/13/92        1.0d4        update to a11
  17.  * SJF        09/09/92        1.0d3        update to a9
  18.  * SJF        05/07/92        1.0d2        update to a6
  19.  * SJF        11/06/91        1.0d1        initial coding
  20.  *
  21.  */
  22.  
  23. #ifndef __OCESTANDARDMAIL__
  24. #include <OCEStandardMail.h>
  25. #endif
  26.  
  27. #ifndef __OCEERRORS__
  28. #include <OCEErrors.h>
  29. #endif
  30.  
  31. #include "const.h"
  32. #include "strconst.h"
  33. #include "mytypes.h"
  34. #include "globals.h"
  35. #include "utils.h"
  36. #include "windowstuff.h"
  37. #include "mymenus.h"
  38. #include "myaoce.h"
  39. #include "myaocetypes.h"
  40. #include "windutils.h"
  41.  
  42. #include "base.window.h"
  43. #include "draw.window.h"
  44. #include "draw.mailer.window.h"
  45.  
  46. #define kDefaultIdentity 0
  47.  
  48. /* instantiate a new draw mailer window */
  49.  
  50. WindowPtr DMailerMakeWindow(Rect *wRect,StringPtr title,Boolean visible,short wdefProc,Boolean goAwayFlag)
  51. {
  52.     WInfoPtr infoPtr;
  53.     WindowPtr theWindow;
  54.     char hState;
  55.     Point topLeft = {0,0};
  56.     short mWidth,contHeight,expHeight;
  57.     OSErr err;
  58.     
  59.     theWindow = BaseMakeWindow(wRect,title,visible,wdefProc,goAwayFlag);
  60.     SetWindowKind(theWindow,kDrawMailerWindow);
  61.     
  62.     infoPtr = BeginWindowAccess(theWindow,&hState);
  63.     
  64.     SetDMailerMethods(infoPtr);
  65.     
  66.     infoPtr->otherData[kLetterDescData] = nil;
  67.     infoPtr->otherData[kLastChangedData] = 0;
  68.     infoPtr->otherFlags[kMailerExpanded] = gPreferences.expandOnOpen;
  69.     infoPtr->data = nil;
  70.     
  71.     // adjust window inset area
  72.     
  73.     err = SMPGetDimensions(&mWidth,&contHeight,&expHeight);
  74.     if (err!=noErr)
  75.         DoError(err);
  76.     if (infoPtr->otherFlags[kMailerExpanded])
  77.         infoPtr->topIndent += expHeight;
  78.     else
  79.         infoPtr->topIndent += contHeight;
  80.  
  81.     // make scroll bars
  82.  
  83.     MakeScrollBars(theWindow,infoPtr);
  84.     
  85.     EndWindowAccess(theWindow,hState);
  86.     return theWindow;
  87. }
  88.  
  89.  
  90. void SetDMailerMethods(WInfoPtr infoPtr)
  91. {
  92.     infoPtr->m_idle = BaseIdleWindow;
  93.     infoPtr->m_fixCursor = DMailerFixCursorWindow;
  94.     infoPtr->m_activate = DMailerActivateWindow;
  95.     infoPtr->m_deactivate = DMailerDeactivateWindow;
  96.     infoPtr->m_update = DMailerUpdateWindow;
  97.     infoPtr->m_key = BaseKeyWindow;
  98.     infoPtr->m_resize = DrawResizeWindow;
  99.     infoPtr->m_click = DMailerClickWindow;
  100.     infoPtr->m_destroy = DMailerDestroyWindow;
  101.     infoPtr->m_undo = DMailerUndoWindow;
  102.     infoPtr->m_cut = DMailerCutWindow;
  103.     infoPtr->m_copy = DMailerCopyWindow;
  104.     infoPtr->m_paste = DMailerPasteWindow;
  105.     infoPtr->m_clear = DMailerClearWindow;
  106.     infoPtr->m_print = DMailerPrintWindow;
  107.     infoPtr->m_pageSetup = DMailerPageSetupWindow;
  108.     infoPtr->m_save = DMailerSaveWindow;
  109.     infoPtr->m_load = DMailerLoadWindow;
  110.     infoPtr->m_event = DMailerEventWindow;
  111.     infoPtr->m_ctrlHit = DrawHitControlWindow;
  112.     infoPtr->m_selectAll = DMailerSelectAllWindow;
  113.     infoPtr->m_group = DrawGroupWindow;
  114.     infoPtr->m_unGroup = DrawUnGroupWindow;
  115. }
  116.  
  117.  
  118. void *DMailerFixCursorWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  119. {
  120.     RgnHandle returnRgn;
  121.     unsigned long *crsrData;
  122.     RgnHandle arrowRgn,pencilRgn,mailerRgn;
  123.     Point offsetPt,mousePt;
  124.     GrafPtr savePort;
  125.     Rect drawRect;
  126.     
  127.     GetPort(&savePort);
  128.     SetPort(window);
  129.         
  130.     crsrData = (unsigned long *)data;
  131.     returnRgn = (RgnHandle)crsrData[1];
  132.     mousePt = *(Point *)&crsrData[0];
  133.     arrowRgn = NewRgn();
  134.     pencilRgn = NewRgn();
  135.     mailerRgn = NewRgn();
  136.     
  137.     drawRect = window->portRect;
  138.     drawRect.bottom -= 15;
  139.     drawRect.right -= 15;
  140.     
  141.     SetRectRgn(arrowRgn,-32768,-32768,32767,32767);
  142.     RectRgn(pencilRgn,&drawRect);
  143.     SetPt(&offsetPt,0,0);
  144.     LocalToGlobal(&offsetPt);
  145.     OffsetRgn(pencilRgn,offsetPt.h,offsetPt.v);
  146.     DiffRgn(arrowRgn,pencilRgn,arrowRgn);
  147.  
  148.     drawRect.top += infoPtr->topIndent;
  149.     RectRgn(pencilRgn,&drawRect);
  150.     OffsetRgn(pencilRgn,offsetPt.h,offsetPt.v);
  151.     drawRect.top -= infoPtr->topIndent;
  152.     drawRect.bottom = drawRect.top + infoPtr->topIndent;
  153.     RectRgn(mailerRgn,&drawRect);
  154.     OffsetRgn(mailerRgn,offsetPt.h,offsetPt.v);
  155.     
  156.     if (PtInRgn(mousePt,arrowRgn)) {
  157.         CopyRgn(arrowRgn,returnRgn);
  158.         SetCursor(&qd.arrow);
  159.     }
  160.     else if (PtInRgn(mousePt,pencilRgn)) {
  161.         CopyRgn(pencilRgn,returnRgn);
  162.         if (gCurrentShape!=kSelectShape)
  163.             SetCursor(&gPencilCursor);
  164.         else
  165.             SetCursor(&qd.arrow);
  166.     }
  167.     else if (PtInRgn(mousePt,mailerRgn)) {
  168.         CopyRgn(mailerRgn,returnRgn);
  169.     }
  170.  
  171.         
  172.     DisposeRgn(arrowRgn);
  173.     DisposeRgn(pencilRgn);
  174.     DisposeRgn(mailerRgn);
  175.     SetPort(savePort);
  176.     
  177.     return BaseFixCursorWindow(window,infoPtr,data);
  178. }
  179.  
  180.  
  181. void *DMailerClickWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  182. {
  183.     RgnHandle savedClip;
  184.     GrafPtr savePort;
  185.     void *returnVal;
  186.     OSErr err;
  187.     
  188.     // make sure we can change the content of the letter
  189.     
  190.     err = SMPPrepareToChange(window);
  191.     if (err!=noErr) {
  192.         DoError(err);
  193.         return nil;
  194.     }
  195.  
  196.     // since we're drawing a shape, clear any mailer undo buffer
  197.     
  198.     err = SMPClearUndo(window);
  199.     if (err!=noErr)
  200.         DoError(err);
  201.         
  202.     // we're going to change the content of the letter, so notify the mailer
  203.         
  204.     err = SMPContentChanged(window);
  205.     if (err!=noErr)
  206.         DoError(err);
  207.             
  208.     GetPort(&savePort);    
  209.     SetPort(window);
  210.     savedClip = NewRgn();
  211.     GetClip(savedClip);
  212.  
  213.     ClipToDrawing(window,infoPtr);
  214.     
  215.     returnVal = DrawClickWindow(window,infoPtr,data);
  216.  
  217.     SetClip(savedClip);
  218.     DisposeRgn(savedClip);
  219.     SetPort(savePort);
  220.     
  221.     return returnVal;
  222. }
  223.  
  224.  
  225. void *DMailerDestroyWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  226. {
  227.     OSErr err;
  228.     SMPCloseOptions *closeOptions,noCloseOptions;
  229.     
  230.     if (infoPtr->otherData[kLetterDescData])
  231.         DisposHandleChk((Handle)infoPtr->otherData[kLetterDescData]);
  232.     
  233.     if (gPreferences.closeOptionsDialog)
  234.         closeOptions = &gPreferences.closeOptions;
  235.     else {
  236.         noCloseOptions.moveToTrash = false;
  237.         noCloseOptions.addTag = false;
  238.         noCloseOptions.tag.dataLength = 0;
  239.         closeOptions = &noCloseOptions;
  240.     }
  241.     
  242.     err = SMPDisposeMailer(window,closeOptions);
  243.     if (err!=noErr)
  244.         DoError(err);
  245.     
  246.     return DrawDestroyWindow(window,infoPtr,data);
  247. }
  248.  
  249. void *DMailerActivateWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  250. {
  251.     #pragma unused (data)
  252.     MenuHandle theMenu;
  253.     
  254.     DisableAllMenus();
  255.     
  256.     theMenu = GetMHandle(kFileMenu);
  257.     EnableAllMenuItems(theMenu);
  258.     if (!infoPtr->changed)
  259.         DisableItem(theMenu, kSaveItem);
  260.     
  261.     theMenu = GetMHandle(kShapesMenu);
  262.     EnableAllMenuItems(theMenu);
  263.     theMenu = GetMHandle(kSignMenu);
  264.     EnableAllMenuItems(theMenu);
  265.             
  266.     FixMailerMenus(window,infoPtr);    // fixes up file,edit,mail menu
  267.  
  268.     gMenusDirty = true;
  269.     
  270.     HiliteControl(VSCROLL,0);
  271.     HiliteControl(HSCROLL,0);
  272.     MyDrawGrowIcon(window);
  273.     
  274.     return nil;
  275. }
  276.  
  277.  
  278. void *DMailerDeactivateWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  279. {
  280.     #pragma unused (data)
  281.     MenuHandle theMenu;
  282.     Str255 addMailerText;
  283.         
  284.     HiliteControl(VSCROLL,254);
  285.     HiliteControl(HSCROLL,254);
  286.     MyDrawGrowIcon(window);
  287.  
  288.     theMenu = GetMHandle(kMailMenu);
  289.     GetResString(addMailerText,kAddMailerTextID,kAddMailerText);
  290.     SetItem(theMenu,kAddRemMailItem,addMailerText);
  291.  
  292.     SetDefaultMenus();
  293.     gMenusDirty = true;
  294.     return nil;
  295. }
  296.  
  297.  
  298. void *DMailerUpdateWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  299. {
  300.     RgnHandle savedClip;
  301.     
  302.     savedClip = NewRgn();
  303.     GetClip(savedClip);
  304.     ClipToDrawing(window,infoPtr);
  305.     
  306.     DrawUpdateWindow(window,infoPtr,data);
  307.     
  308.     SetClip(savedClip);
  309.     DisposeRgn(savedClip);
  310.     
  311.     return nil;
  312. }
  313.  
  314.  
  315. void *DMailerEventWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  316. {
  317.     SMPMailerResult whatHappened;
  318.     EventRecord *ev;
  319.     OSErr err;
  320.     
  321.     ev = (EventRecord *)data;
  322.     
  323.     err = ProcessAOCEEvent(window,infoPtr,ev,&whatHappened);
  324.     if (err!=noErr) {
  325.         DoError(err);
  326.         return false;
  327.     }
  328.             
  329.     return (void *)(ProcessAOCEWhatHappened(window,infoPtr,whatHappened));
  330. }
  331.  
  332.  
  333. void *DMailerUndoWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  334. {
  335.     OSErr err;
  336.     SMPMailerResult whatHappened;
  337.     
  338.     err = SMPMailerEditCommand(window,kSMPUndoCommand,&whatHappened);
  339.     if (err!=noErr)
  340.         DoError(err);
  341.     
  342.     if (!ProcessAOCEWhatHappened(window,infoPtr,whatHappened)) {
  343.         err = SMPBecomeTarget(window,false,0);
  344.         // ignore errors here- we may already be the target
  345.         DrawUndoWindow(window,infoPtr,data);
  346.     }
  347.     
  348.     return nil;
  349. }
  350.  
  351.  
  352. void *DMailerCutWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  353. {
  354.     #pragma unused (data)
  355.     OSErr err;
  356.     SMPMailerResult whatHappened;
  357.     
  358.     err = SMPMailerEditCommand(window,kSMPCutCommand,&whatHappened);
  359.     if (err!=noErr)
  360.         DoError(err);
  361.         
  362.     return (void *)(ProcessAOCEWhatHappened(window,infoPtr,whatHappened));
  363. }
  364.  
  365.  
  366. void *DMailerCopyWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  367. {
  368.     #pragma unused (data)
  369.     OSErr err;
  370.     SMPMailerResult whatHappened;
  371.     
  372.     err = SMPMailerEditCommand(window,kSMPCopyCommand,&whatHappened);
  373.     if (err!=noErr)
  374.         DoError(err);
  375.         
  376.     return (void *)(ProcessAOCEWhatHappened(window,infoPtr,whatHappened));
  377. }
  378.  
  379.  
  380. void *DMailerPasteWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  381. {
  382.     #pragma unused (data)
  383.     OSErr err;
  384.     SMPMailerResult whatHappened;
  385.     
  386.     err = SMPMailerEditCommand(window,kSMPPasteCommand,&whatHappened);
  387.     if (err!=noErr)
  388.         DoError(err);
  389.         
  390.     return (void *)(ProcessAOCEWhatHappened(window,infoPtr,whatHappened));
  391. }
  392.  
  393.  
  394. void *DMailerClearWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  395. {
  396.     #pragma unused (data)
  397.     OSErr err;
  398.     SMPMailerResult whatHappened;
  399.     
  400.     err = SMPMailerEditCommand(window,kSMPClearCommand,&whatHappened);
  401.     if (err!=noErr)
  402.         DoError(err);
  403.         
  404.     return (void *)(ProcessAOCEWhatHappened(window,infoPtr,whatHappened));
  405. }
  406.  
  407.  
  408. void *DMailerSelectAllWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  409. {
  410.     OSErr err;
  411.     SMPMailerResult whatHappened;
  412.     SMPMailerState mailerState;
  413.     
  414.     err = SMPGetMailerState(window,&mailerState);
  415.     if (err!=noErr)
  416.         DoError(err);
  417.     
  418.     if (mailerState.isTarget) {
  419.         err = SMPMailerEditCommand(window,kSMPSelectAllCommand,&whatHappened);
  420.         if (err!=noErr)
  421.             DoError(err);
  422.         return (void *)(ProcessAOCEWhatHappened(window,infoPtr,whatHappened));
  423.     }
  424.     else {
  425.         DrawSelectAllWindow(window,infoPtr,data);
  426.     }
  427.     return nil;    
  428. }
  429.  
  430.  
  431. void *DMailerPrintWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  432. {
  433.     #pragma unused (data)
  434.     OSErr err;
  435.     short pageCount,curPage;
  436.     Boolean shouldContinue;
  437.     TPPrPort thePrPort;
  438.     TPrStatus theStatus;
  439.     Point zeroOffset = {0,0};
  440.     
  441.     // open print driver
  442.     
  443.     PrOpen();
  444.     if (PrError()!=noErr) {
  445.         DoError(PrError());
  446.         return nil;
  447.     }
  448.     
  449.     // display print dialog
  450.     
  451.     shouldContinue = PrJobDialog(infoPtr->printRecord);
  452.     if (PrError()!=noErr) {
  453.         DoError(PrError());
  454.         return nil;
  455.     }
  456.     if (!shouldContinue)
  457.         return nil;
  458.     
  459.     // init printing grafport
  460.     
  461.     thePrPort = PrOpenDoc(infoPtr->printRecord,nil,nil);
  462.     if (PrError()==noErr) {
  463.         err = SMPPrepareCoverPages(window,&pageCount);
  464.         if (err!=noErr)
  465.             DoError(err);
  466.         for (curPage=1;curPage<=pageCount;curPage++) {
  467.             PrOpenPage(thePrPort,nil);
  468.             if (PrError()==noErr)
  469.                 err = SMPDrawNthCoverPage(window,curPage,(curPage==pageCount));
  470.                 if (err!=noErr)
  471.                     DoError(err);
  472.             PrClosePage(thePrPort);
  473.         
  474.         }
  475.         
  476.         PrOpenPage(thePrPort,nil);
  477.         DrawAllShapes(infoPtr,zeroOffset);
  478.         PrClosePage(thePrPort);
  479.     }
  480.     PrCloseDoc(thePrPort);
  481.     
  482.     if ((((TPPrint)*(infoPtr->printRecord))->prJob.bJDocLoop == bSpoolLoop) && (PrError() == noErr))
  483.         PrPicFile(infoPtr->printRecord, nil, nil, nil, &theStatus);                
  484.  
  485.     // close print driver
  486.     
  487.     PrClose();
  488.     
  489.     return nil;
  490.     
  491.     return nil;
  492. }
  493.  
  494.  
  495. void *DMailerPageSetupWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  496. {
  497.     OSErr err;
  498.     
  499.     // make sure we can change the content of the letter
  500.     
  501.     err = SMPPrepareToChange(window);
  502.     if (err!=noErr) {
  503.         DoError(err);
  504.         return nil;
  505.     }
  506.     // we have changed the content of the letter, so notify the mailer
  507.     
  508.     err = SMPContentChanged(window);
  509.     if (err!=noErr) {
  510.         DoError(err);
  511.         return nil;
  512.     }
  513.     
  514.     return DrawPageSetupWindow(window,infoPtr,data);
  515. }
  516.  
  517.  
  518. void *DMailerLoadWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  519. {
  520.     OSErr err;
  521.     LetterDescriptor *letterDesc;
  522.     Point upLeft = {0,0};
  523.     FSSpec enclSpec;
  524.     Handle letterDescHndl;
  525.     
  526.     letterDescHndl = NewHandleChk(sizeof(LetterDescriptor));
  527.     if (MemError()!=noErr) {
  528.         DoError(MemError());
  529.         return nil;
  530.     }
  531.     
  532.     letterDesc = (LetterDescriptor *)data;
  533.     BlockMove(letterDesc,*letterDescHndl,sizeof(LetterDescriptor));
  534.     if (infoPtr->otherData[kLetterDescData])
  535.         DoError(kInternalError);
  536.     infoPtr->otherData[kLetterDescData] = letterDescHndl;
  537.     
  538.     err = SMPOpenLetter(letterDesc,window,upLeft,true,gPreferences.expandOnOpen,nil,0L);
  539.     if (err!=noErr) {
  540.         DoError(err);
  541.         return nil;
  542.     }
  543.     
  544.     err = SMPGetMainEnclosureFSSpec(window,&enclSpec);
  545.     if (err!=noErr) {
  546.         DoError(err);
  547.         return nil;
  548.     }
  549.     
  550.     return DrawLoadWindow(window,infoPtr,&enclSpec);
  551. }
  552.  
  553.  
  554. void *DMailerSaveWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  555. {
  556.     OSErr err;
  557.     
  558.     err = LoSaveLetter(window,infoPtr,(SMPSaveType)data);
  559.     if (err!=noErr) {
  560.         DoError(err);
  561.         return nil;
  562.     }
  563.     
  564.     SetWTitle(window,infoPtr->fileSpec.name);
  565.     return BaseSaveWindow(window,infoPtr,data);
  566. }
  567.